home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_2 / star-1_0.tar / chip8.star < prev    next >
Text File  |  1991-03-22  |  9KB  |  677 lines

  1. ;;++
  2. ;;
  3. ;;   CHIP-8 Macro Definitions for STAR, the Saturn Macro Assembler
  4. ;;
  5. ;;   Copyright (C) 1990 Roger Ivie
  6. ;;   Copyright (C) 1990 Jan Brittenson
  7. ;;
  8. ;;--
  9.  
  10.     save list
  11.     list = 0
  12.  
  13.     if (pass == 1) && !chip8loaded
  14.  
  15. ;;++
  16. ;;
  17. ;;      This macro package is based on the M80 (Digital Research'
  18. ;;   Macro Assembler for the Intel 8080 and Zilog Z80 families of
  19. ;;   micro processors) written by:
  20. ;;
  21. ;;    Roger Ivie
  22. ;;    slsw2@cc.usu.edu (internet)
  23. ;;    35 South 300 West
  24. ;;    Logan, Utah 84321
  25. ;;
  26. ;;
  27. ;;      If you have questions regarding the STAR port, or about the
  28. ;;   STAR Macro assembler, write to:
  29. ;;
  30. ;;    Jan Brittenson <bson@ai.mit.edu>
  31. ;;
  32. ;;
  33. ;;--
  34.  
  35. ; Define symbols for the registers. Note that the scheme assumes that 
  36. ; data will never be bigger than 12 bits.
  37.  
  38.     v0=x'0f000
  39.     v1=x'0f001
  40.     v2=x'0f002
  41.     v3=x'0f003
  42.     v4=x'0f004
  43.     v5=x'0f005
  44.     v6=x'0f006
  45.     v7=x'0f007
  46.     v8=x'0f008
  47.     v9=x'0f009
  48.     va=x'0f00a
  49.     vb=x'0f00b
  50.     vc=x'0f00c
  51.     vd=x'0f00d
  52.     ve=x'0f00e
  53.     vf=x'0f00f
  54.  
  55.     hide    v0
  56.     hide    v1
  57.     hide    v2
  58.     hide    v3
  59.     hide    v4
  60.     hide    v5
  61.     hide    v6
  62.     hide    v7
  63.     hide    v8
  64.     hide    v9
  65.     hide    va
  66.     hide    vb
  67.     hide    vc
  68.     hide    vd
  69.     hide    ve
  70.     hide    vf
  71.  
  72.     __instrhi=0
  73.     __instrlo=0
  74.  
  75.     hide    __instrhi
  76.     hide    __instrlo
  77.  
  78. ;-------
  79. ;
  80. ;    Other-endian DW
  81.  
  82.     macro __dw value=0
  83.  
  84.     value = $value
  85.     byte    value >> 8 & 0xff, value & 0xff
  86.  
  87.     endmacro
  88.  
  89.     hide    __dw
  90.  
  91. ;-------
  92. ;
  93. ;    Clear screen:
  94. ;
  95. ;    CLS
  96.  
  97.     macro    cls
  98.     __dw    0x00e0
  99.     endmacro
  100.  
  101.     hide    cls
  102.  
  103. ;-------
  104. ;
  105. ;    Return from subroutine:
  106. ;
  107. ;    RET
  108. ;    RETURN
  109.  
  110.     macro    ret
  111.     __dw    0x00ee
  112.     endmacro
  113.  
  114.     macro    return
  115.     __dw    0x00ee
  116.     endmacro
  117.  
  118.     hide    ret
  119.     hide    return
  120.  
  121. ;-------
  122. ;
  123. ;    Jump to location:
  124. ;
  125. ;    JUMP <addr>
  126. ;    JUMP <addr>+V0
  127.  
  128.     macro    jump dest
  129.  
  130.     dest=$dest
  131.  
  132.     if dest >= v0
  133.       __dw    dest & 0x0fff + 0x0b000
  134.     else        ;; Otherwise, it's JUMP <addr>
  135.       __dw    dest + 0x01000
  136.     endif
  137.  
  138.     endmacro
  139.  
  140.     hide    jump
  141.  
  142. ;-------
  143. ;
  144. ;    Call a subroutine:
  145. ;
  146. ;    CALL <addr>
  147. ;
  148.  
  149.     macro    call  dest
  150.  
  151.       __dw    $dest + 0x02000
  152.  
  153.     endmacro
  154.  
  155.     hide    call
  156.  
  157. ;-------
  158. ;
  159. ;    Skip if equal:
  160. ;
  161. ;    SKE Vx,<constant>
  162. ;    SKE Vx,Vy
  163.  
  164.     macro    ske x, y
  165.  
  166.     x = $x
  167.     y = $y
  168.  
  169.     if x >= v0    ;; Verify first operand is a register
  170.       if y >= v0    ;; It's SKE Vx,Vy
  171.  
  172.         __dw ((x & 0xf) << 8) + ((y & 0xf) << 4) + 0x5000
  173.       else
  174.         __dw ((x & 0xf) << 8) + y + 0x3000
  175.       endif
  176.     else
  177.       error The first operand of SKE must be a register, not `$x'
  178.       data.4  0
  179.     endif
  180.  
  181.     endmacro
  182.  
  183.     hide    ske
  184.  
  185. ;-------
  186. ;
  187. ;    Skip if not equal:
  188. ;
  189. ;    SKNE Vx,<constant>
  190. ;    SKNE Vx,Vy
  191.  
  192.     macro    skne x, y
  193.  
  194.     x = $x
  195.     y = $y
  196.  
  197.     if x >= v0    ;; Verify first operand is a register
  198.       if y >= v0    ;; It's SKNE Vx,Vy
  199.  
  200.         __dw ((x & 0xf) << 8) + ((y & 0xf) << 4) + 0x9000
  201.  
  202.       else        ;; It's SKNE Vx,<constant>
  203.  
  204.         __dw ((x & 0xf) << 8) + y + 0x4000
  205.       endif
  206.     else
  207.       error The first operand of SKNE must be a register, not `$x'
  208.       data.4  0
  209.     endif
  210.  
  211.     endmacro
  212.  
  213.     hide    skne
  214.  
  215. ;-------
  216. ;
  217. ;    Register transfer:
  218. ;
  219. ;    LD Vx,<constant>
  220. ;    LD Vx,Vy
  221. ;    LD I,<constant>
  222. ;    LD Vx,DELAY
  223. ;    LD DELAY,Vx
  224. ;    LD SOUND,Vx
  225. ;    LD BCD,Vx
  226. ;    LD @I,Vx
  227. ;    LD Vx,@I
  228.  
  229.     macro    ld dest, src
  230.  
  231.     if uc^dest == `I'    ;; It's LD I,?
  232.       if ($src) < v0    ;;   Source has to be a constant
  233.  
  234.         __dw  ($src) + 0xa000
  235.       else
  236.         error I can only be loaded from a constant, not `$src'
  237.         data.4  0
  238.       endif
  239.     else            ;; *1*
  240.  
  241.     if uc^dest == `DELAY'    ;; It's LD DELAY,?
  242.       if ($src) >= v0    ;;   Source has to be a register
  243.  
  244.         __dw ($src) & 0xf << 8 + 0xf015
  245.       else
  246.         error DELAY can only be loaded from a register, not `$src'
  247.         data.4  0
  248.       endif
  249.     else            ;; *2*
  250.  
  251.     if uc^src == `DELAY'    ;; It's LD ?,DELAY
  252.       if ($dest) >= v0    ;;   Destination has to be a register
  253.  
  254.         __dw  ($dest) & 0xf << 8 + 0xf007
  255.       else
  256.         error Only a register can be loaded from DELAY, not `$src'
  257.         data.4  0
  258.       endif
  259.     else            ;; *3*
  260.  
  261.     if uc^dest == `SOUND'    ;; It's LD SOUND,?
  262.       if ($src) >= v0    ;;   Source has to be a register
  263.  
  264.         __dw ($src) & 0xf << 8 + 0xf018
  265.       else
  266.         error SOUND can only be loaded from a register, not `$src'
  267.         data.4  0
  268.       endif
  269.     else            ;; *4*
  270.  
  271.     if uc^dest == `BCD'    ;; It's LD BCD,?
  272.       if ($src) >= v0    ;; Source has to be a register
  273.  
  274.         __dw  ($src) & 0xf << 8 + 0xf033
  275.       else
  276.         error BCD can only be loaded from a register, not `$src'
  277.         data.4  0
  278.       endif
  279.     else            ;; *5*
  280.  
  281.     if uc^dest == `@I'    ;; It's LD @I,?
  282.       if src >= v0        ;; Source has to be a register
  283.  
  284.         __dw ($src) & 0xf << 8 + 0xf055
  285.       else
  286.         error @I can only be loaded from a register, not `$src'
  287.         data.4  0
  288.       endif
  289.     else            ;; *6*
  290.  
  291.     if uc^src == `@I'    ;; It's LD ?,@I
  292.       if ($dest) >= v0    ;; Destination as to be a register
  293.  
  294.         __dw  ($dest) & 0xf << 8 + 0xf065
  295.       else
  296.         error Only a register can be loaded from @I, not `$dest'
  297.         data.4  0
  298.       endif
  299.  
  300.     else            ;; *7*
  301.  
  302. ;; If we get here, it should be either LD Vx,Vy or LD Vx,<constant>
  303.  
  304.     dest = $dest
  305.     src = $src
  306.  
  307.     if dest >= v0        ;; Make certain destination is a register
  308.       if src < v0        ;;   It's LD Vx,<constant>
  309.  
  310.         __dw dest & 0xf << 8 + src + 0x6000
  311.  
  312.       else            ;;   It has to be LD Vx,Vy
  313.  
  314.         __dw dest & 0xf << 8 + (src & 0xf << 4) + 0x8000
  315.       endif
  316.     else
  317.       error Invalid LD instruction
  318.       data.4  0
  319.  
  320.     endif
  321.  
  322.     endif
  323.     endif
  324.     endif
  325.     endif
  326.     endif
  327.     endif
  328.     endif
  329.       
  330.     endmacro
  331.  
  332.     hide    ld
  333.  
  334. ;-------
  335. ;
  336. ;    Add two operands:
  337. ;
  338. ;    ADD Vx,<constant>
  339. ;    ADD Vx,Vy
  340. ;    ADD I,Vx
  341.  
  342.     macro    add dest, src
  343.  
  344.     src  = $src
  345.  
  346.     if uc^dest == `I'    ;; It's ADD I,Vx
  347.       if src >= v0        ;;   Verify that the source is a register
  348.  
  349.         __dw src & 0xf << 8 + 0xf01e
  350.       else
  351.         error Only a register can be added to I, not `$src'
  352.         data.4  0
  353.       endif
  354.     else            ;; *1*
  355.  
  356. ;; It has to be either ADD Vx,Vy or ADD Vx,<constant>
  357.  
  358.     dest = $dest
  359.  
  360.     if dest >= v0        ;; Verify that the destination is a register
  361.           if src >= v0        ;;   It's ADD Vx,Vy
  362.  
  363.         __dw dest & 0xf << 8 + (src & 0xf << 4) + 0x8004
  364.  
  365.       else            ;;   It's ADD Vx,<constant>
  366.  
  367.         __dw dest & 0xf << 8 + src + 0x7000
  368.       endif
  369.     else
  370.       error Things can be ADDed only to I or to a register, not `$dest'
  371.       data.4  0
  372.     endif
  373.  
  374.     endif
  375.  
  376.     endmacro
  377.  
  378.     hide    add
  379.  
  380. ;-------
  381. ;
  382. ;    Inclusive or:
  383. ;
  384. ;    OR Vx,Vy
  385.  
  386.     macro    or dest,src
  387.  
  388.     dest = $dest
  389.     src = $src
  390.  
  391.     if (dest >= v0) && (src >= v0)
  392.       __dw ((dest & 0xf) << 8) + ((src & 0xf) << 4) + 0x8001
  393.     else
  394.       error Both operands must be registers
  395.       data.4  0
  396.     endif
  397.  
  398.     endmacro
  399.  
  400.     hide    or
  401.  
  402. ;-------
  403. ;
  404. ;    Bitwise and:
  405. ;
  406. ;    AND Vx,Vy
  407.  
  408.     macro    and dest,src
  409.  
  410.     dest = $dest
  411.     src = $src
  412.  
  413.     if (dest >= v0) && (src >= v0)
  414.       __dw ((dest & 0xf) << 8) + ((src & 0xf) << 4) + 0x8002
  415.     else
  416.       error Both operands must be registers
  417.       data.4  0
  418.     endif
  419.  
  420.     endmacro
  421.  
  422.     hide    and
  423.  
  424. ;-------
  425. ;
  426. ;    Bitwise exclusive or:
  427. ;
  428. ;    XOR Vx,Vy
  429.  
  430.     macro    xor dest,src
  431.  
  432.     dest = $dest
  433.     src = $src
  434.  
  435.     if (dest >= v0) && (src >= v0)
  436.  
  437.       __dw ((dest & 0xf) << 8) + ((src & 0xf) << 4) + 0x8003
  438.     else
  439.       error Both operands must be registers
  440.       data.4 0
  441.     endif
  442.  
  443.     endmacro
  444.  
  445.     hide    xor
  446.  
  447. ;-------
  448. ;
  449. ;    Subtract:
  450. ;
  451. ;    SUB Vx,Vy
  452.  
  453.     macro    sub dest,src
  454.  
  455.     dest = $dest
  456.     src = $src
  457.  
  458.     if (dest >= v0) && (src >= v0)
  459.       __dw  ((dest & 0xf) << 8) + ((src & 0xf) << 4) + 0x8005
  460.     else
  461.       error Both operands must be registers
  462.       data.4  0
  463.     endif
  464.     endmacro
  465.  
  466.     hide    sub
  467.  
  468. ;-------
  469. ;
  470. ;    Shift right:
  471. ;
  472. ;    SHR Vx,Vy
  473.  
  474.     macro    shr dest,src
  475.  
  476.     dest = $dest
  477.     src = $src
  478.  
  479.     if (dest >= v0) && (src >= v0)
  480.       __dw  ((dest & 0xf) << 8) + ((src & 0xf) << 4) + 0x8006
  481.     else
  482.       error Both operands must be registers
  483.       data.4  0
  484.     endif
  485.     endmacro
  486.  
  487.     hide    shr
  488.  
  489. ;-------
  490. ;
  491. ;    Reverse subtract:
  492. ;
  493. ;    RSUB Vx,Vy
  494.  
  495.     macro    rsub dest,src
  496.  
  497.     dest = $dest
  498.     src = $src
  499.  
  500.     if (dest >= v0) && (src >= v0)
  501.       __dw  ((dest & 0xf) << 8) + ((src & 0xf) << 4) + 0x8007
  502.     else
  503.       error Both operands must be registers
  504.       data.4  0
  505.     endif
  506.  
  507.     endmacro
  508.  
  509.     hide    rsub
  510.  
  511. ;-------
  512. ;
  513. ;    Shift left:
  514. ;
  515. ;    SHL Vx,Vy
  516.  
  517.     macro    shl dest,src
  518.  
  519.     dest = $dest
  520.     src = $src
  521.  
  522.     if (dest >= v0) && (src >= v0)
  523.       __dw ((dest & 0xf) << 8) + ((src & 0xf) << 4) + 0x800E
  524.     else
  525.       error Both operands must be registers
  526.       data.4  0
  527.     endif
  528.     endmacro
  529.  
  530.     hide    shl
  531.  
  532. ;-------
  533. ;
  534. ;    And constant and random number:
  535. ;
  536. ;    RANDOM Vx        ; Uses 0FFH for constant
  537. ;    RANDOM Vx,<constant>
  538.  
  539.     macro    random dest,mask=``nil''
  540.  
  541.     dest = $dest
  542.     mask = $mask
  543.  
  544.     if dest >= v0
  545.           if mask == `nil'
  546.         __dw ((dest & 0xf) << 8) + 0xc0ff
  547.       else
  548.         __dw ((dest & 0xf) << 8) + mask + 0xc000
  549.       endif
  550.     else
  551.       error First operand must be a register, not `$dest'
  552.       data.4 0
  553.     endif
  554.     endmacro
  555.  
  556.     hide    random
  557.  
  558. ;-------
  559. ;
  560. ;    Show sprite:
  561. ;
  562. ;    SHOW Vx,Vy,N
  563.  
  564.     macro    show x,y,n
  565.  
  566.     x = $x
  567.     y = $y
  568.     n = $n
  569.  
  570.     if (x >= v0) && (y >= v0)
  571.       __DW ((x & 0xf) << 8) + ((y & 0xf) << 4) + (n & 0xf) + 0xd000
  572.     else
  573.       error Coordinates must be registers
  574.       data.4  0
  575.     endif
  576.  
  577.     endmacro
  578.  
  579.     hide    show
  580.  
  581. ;-------
  582. ;
  583. ;    Skip if key pressed:
  584. ;
  585. ;    SKIFKEY Vx
  586.  
  587.     macro    skifkey dest
  588.  
  589.     dest = $dest
  590.  
  591.     if dest >= v0
  592.       __dw  ((dest & 0xf) << 8) + 0xe09e
  593.     else
  594.       error Destination must be a register
  595.       data.4  0
  596.     endif
  597.  
  598.     endmacro
  599.  
  600.     hide    skifkey
  601.  
  602. ;-------
  603. ;
  604. ;    Skip if key not pressed:
  605. ;
  606. ;    SKIFNOTKEY Vx
  607.  
  608.     macro    skifnotkey dest
  609.  
  610.     dest = $dest
  611.  
  612.     if dest >= v0
  613.       __dw ((dest & 0xf) << 8) + 0xe0a1
  614.     else
  615.       error Destination must be a register, not `$dest'
  616.       data.4  0
  617.     endif
  618.  
  619.     endmacro
  620.  
  621.     hide    skifnotkey
  622.  
  623. ;-------
  624. ;
  625. ;    Get a keystroke:
  626. ;
  627. ;    GETKEY Vx
  628.  
  629.     macro    getkey dest
  630.  
  631.     dest = $dest
  632.  
  633.     if dest >= v0
  634.       __dw  ((dest & 0xf) << 8) + 0xf00a
  635.     else
  636.       error Destination must be a register, not `$dest'
  637.       data.4  0
  638.     endif
  639.     endmacro
  640.  
  641.     hide    getkey
  642.  
  643. ;-------
  644. ;
  645. ;    Point to character font element:
  646. ;
  647. ;    CHAR Vx
  648.  
  649.     macro    char src
  650.  
  651.     src = $src
  652.  
  653.     if src >= v0
  654.       __dw  src & 0xf << 8 + 0xf029
  655.     else
  656.       error Source must be a register
  657.       data.4  0
  658.     endif
  659.     endmacro
  660.  
  661.     hide    char
  662.  
  663.  
  664.     chip8loaded = 1
  665.     hide    chip8loaded
  666.  
  667.     static    0, x'1ff
  668.     floating x'200, x'ffff
  669.  
  670.  
  671.     endif
  672.  
  673.     . = x'200
  674.  
  675.     hide    list
  676.     restore    list
  677.